
#include "Mono.h"
#include "../FabricasObjetosJuego.h"

const int EstadoMono::TirandoBarril = 0;
const int EstadoMono::Muriendo = 1;
const int EstadoMono::SinParticular = 2;
const vector<int> EstadoMono::accionesParticulares = make_vector<int>() << EstadoMono::TirandoBarril << EstadoMono::Muriendo;
const vector<string> EstadoMono::descripcionAccionesParticulares = make_vector<string>() << "tirar_barril" << "morir";
const vector<int> EstadoMono::animaciones = make_vector<int>() << EstadoBasico::Quieto << EstadoBasico::Animando;

Mono::Mono(int x, int y, int maximoX, int maximoY, Orientacion orientacion) : ObjetoEstatico(x, y, maximoX, maximoY, orientacion) {

	tiempoUltimaFabricacion = 0;
	estadoParticular = EstadoMono::SinParticular;
	srand( time(NULL) );
	vida = 20;
	tipo = ENEMIGO;
}

void Mono::restarVida() {
	vida --;
}

void Mono::sumarVida() {
	vida ++;
}

pair<idImagen_t, int> Mono::getDibujable(Uint32 time) {
	
	if (time - tiempoUltimaFabricacion > LAPSUS_MINIMO_FABRICACIONES_MONO && estadoParticular != EstadoMono::Muriendo) {
		if (rand() % 100 > 50 ) {
			
			if (orientacion == Derecha) FabricaBarriles::CrearObjeto(posicion.getX() + ancho, posicion.getY() + alto, orientacion);
			if (orientacion == Izquierda) FabricaBarriles::CrearObjeto(posicion.getX(), posicion.getY() + alto, orientacion);
			
			tiempoUltimaFabricacion = time;
			estadoParticular = EstadoMono::TirandoBarril;
			v_animaciones.at(animacionActual)->Reiniciar();
			animacionActual = 0;
			waiting = false;
		}
	}
	
	pair<idImagen_t, int> dibujable;
	
	if (estadoParticular == EstadoMono::SinParticular) {
		dibujable = ObjetoEstatico::getDibujable(time);
	}
	else if (estadoParticular == EstadoMono::TirandoBarril) {
		bool status;
		dibujable = getDibujableParticular(accionesParticulares.at(estadoParticular), time, &status);
		if (!status) {
			estadoParticular = EstadoMono::SinParticular;
		}
	}
	else if (estadoParticular == EstadoMono::Muriendo) {
		bool status;
		dibujable = getDibujableParticular(accionesParticulares.at(estadoParticular), time, &status);
		if (!status) accionesParticulares.at(estadoParticular)->setUltimoCuadro();
	}
	
	return dibujable;
}

void Mono::addAccionParticular(int idImagen, int cuadros) {
	Animacion *animacion = new Animacion (cuadros, 0, idImagen, ancho, alto);
    accionesParticulares.push_back(animacion);
}

void Mono::Morir() {
	estadoParticular = EstadoMono::Muriendo;
}

void Mono::ColisionarConPersonaje(ObjetoEstatico* personaje, int colX, int colY, int colXvieja, int colYvieja) {

	Personaje* per = dynamic_cast<Personaje*> (personaje);

	if (!per->getActivo() || estadoParticular == EstadoMono::Muriendo) return;

	if (per->getArmadura() && per->getInvencibilidad() && per->getVidas() >= 10) {
		per->SumarPuntos(PUNTOS_SUMAR);
		Morir();
		return;
	}

	per->setArmadura(false);
	per->setInvencibilidad(false);
	per->RestarPuntos(PUNTOS_RESTAR);
	per->restarVida();
}

void Mono::ColisionarConEnemigo(ObjetoEstatico* movible, int colX, int colY, int colXvieja, int colYvieja) {
	static_cast<ObjetoMovible*> (movible)->CambiarSentido(1, 1, true);
}
